package com.init.bootframe.system.service.impl;

import com.init.bootframe.system.dao.IMenuDao;
import com.init.bootframe.system.dao.IRoleDao;
import com.init.bootframe.system.service.IMenuService;
import com.init.bootframe.system.vo.MenuVO;
import com.init.bootframe.system.vo.ModuleVO;
import com.init.bootframe.system.vo.RoleModuleVO;
import com.init.bootframe.system.vo.RolePermissionsVO;
import com.init.bootframe.util.TmompConstant;
import com.init.bootframe.util.TmompUser;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class MenuServiceImpl implements IMenuService {

    private Logger logger = LoggerFactory.getLogger(MenuServiceImpl.class); //日志

    @Autowired
    private IMenuDao menuDao; //栏目Dao

    @Autowired
    private IRoleDao roleDao; //角色dao

    /**
     *
     * 栏目列表查询
     *
     * @param menuVO
     * @return
     */
    @Override
    public List<MenuVO> findMenuList(MenuVO menuVO) {
        return menuDao.findMenus(menuVO);
    }

    /**
     *
     * 查询用户所有栏目列表
     *
     * @param menuVO
     * @return
     */
    @Override
    public List<MenuVO> findMenuListByUser(MenuVO menuVO) {
        // 设置当前用户id
        menuVO.setUserId(TmompUser.getCurrentUserId());
        return menuDao.findMenuListByUser(menuVO);
    }

    /**
     *
     * 栏目查询（以id获取MenuVO对象）
     *
     * @param menuVO
     * @return
     */
    @Override
    public MenuVO findMenu(MenuVO menuVO) {
        return menuDao.findMenu(menuVO);
    }

    /**
     *
     * 添加栏目
     *
     * @param menuVO
     * @return
     */
    @Override
    public Map<String, Object> addMenu(MenuVO menuVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            // 添加栏目
            menuDao.addMenu(menuVO);
            // 超级管理员增加栏目权限
            if (null != menuVO.getMenuId() && !"".equals(menuVO.getMenuId())) {
                RolePermissionsVO rpVO = new RolePermissionsVO();
                rpVO.setMenuId(menuVO.getMenuId());
                rpVO.setRoleId(TmompConstant.BaseDataConstant.SUPER_ADMIN_ID);// 默认管理员角色
                roleDao.addRolePermissions(rpVO);
            }
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.TRUE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "添加节点成功！");
            logger.debug("添加节点成功！");
        } catch (Exception e) {
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "添加节点失败！");
            logger.error("添加节点异常！" + e.getMessage());
            throw new RuntimeException("添加节点异常");
        }
        return resultMap;
    }

    /**
     * 修改栏目
     *
     * @param menuVO
     *            参数
     * @return resultMap 返回结果消息
     */
    @Override
    public Map<String, Object> updateMenu(MenuVO menuVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            // 添加栏目
            menuDao.updateMenu(menuVO);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.TRUE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "修改节点成功！");
            logger.debug("修改节点成功！");
        } catch (Exception e) {
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "修改节点失败！");
            logger.error("修改节点异常！" + e.getMessage());
            throw new RuntimeException("修改节点异常");
        }
        return resultMap;
    }

    /**
     * 修改批量栏目
     *
     * @param menuJson
     *            参数
     * @return resultMap 返回结果消息
     */
    @Override
    public Map<String, Object> updateBatchMenu(String menuJson) {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            // 设置批量修改菜单集合
            List<MenuVO> menuList = new ArrayList<MenuVO>();
            if (null != menuJson && !"".equals(menuJson)) {
                JSONObject jsonObj = JSONObject.fromObject(menuJson);
                // JSON数组对象
                JSONArray jsonArray = JSONArray.fromObject(jsonObj.get("nodes"));
                // 判断是否为空
                if (null != jsonArray && !jsonArray.isEmpty()) {
                    Object[] os = jsonArray.toArray();
                    for (int i = 0; i < os.length; i++) {
                        // 递归资子元素
                        recursionJSONData(menuList, JSONObject.fromObject(os[i]));
                    }
                }
                if (menuList.size() > 0) {
                    // 循环修改栏目菜单
                    for (int j = 0; j < menuList.size(); j++) {
                        MenuVO menuVO = menuList.get(j);
                        menuVO.setSortBy(j + "");
                        menuDao.updateBatchMenu(menuVO);
                    }
                }
            }
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.TRUE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "保存栏目成功！");
            logger.debug("修改栏目成功！");
        } catch (Exception e) {
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "保存栏目失败！");
            logger.error("保存栏目异常！" + e.getMessage());
            throw new RuntimeException("保存栏目异常");
        }
        return resultMap;
    }

    /**
     *
     * 栏目删除
     *
     * @param menuVO
     * @return
     */
    @Override
    public Map<String, Object> deleteMenu(MenuVO menuVO) {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            // 删除栏目
            menuDao.deleteMenu(menuVO);
            // 删除功能
            ModuleVO moduleVO = new ModuleVO();
            moduleVO.setMenuId(menuVO.getMenuId());
            deleteModule(moduleVO);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.TRUE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "删除节点成功！");
            logger.debug("删除节点成功！");
        } catch (Exception e) {
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "删除节点失败！");
            logger.error("删除节点失败！" + e.getMessage());
        }
        return resultMap;
    }

    /**
     * 递归循环解析json数据
     *
     * @param menuList
     * @param jsonObj
     */
    private void recursionJSONData(List<MenuVO> menuList, JSONObject jsonObj) {
        MenuVO menuVO = new MenuVO();
        // 栏目Id
        menuVO.setMenuId(jsonObj.get("menuId").toString());
        // 栏目父Id
        menuVO.setParentMenuId(jsonObj.get("parentMenuId").toString());
        menuList.add(menuVO);
        // 判断是否含有下一级栏目
        if (null != jsonObj.get("children")) {
            JSONArray obj = JSONArray.fromObject(jsonObj.get("children"));
            if (null != obj && !obj.isEmpty()) {
                Object[] os = obj.toArray();
                for (int i = 0; i < os.length; i++) {
                    // 调用自身方法
                    recursionJSONData(menuList, JSONObject.fromObject(os[i]));
                }
            }
        }
    }

    /***************** 功能操作 ********************/

    /**
     * 添加功能
     *
     * @param moduleVO
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> addModule(ModuleVO moduleVO) throws Exception {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            // 添加功能
            menuDao.addModule(moduleVO);
            // 超级管理员增加栏目权限
            if (null != moduleVO.getModuleId() && !"".equals(moduleVO.getModuleId())) {
                RoleModuleVO roleModuleVO = new RoleModuleVO();
                roleModuleVO.setModuleId(moduleVO.getModuleId());
                roleModuleVO.setRoleId(TmompConstant.BaseDataConstant.SUPER_ADMIN_ID);// 超级管理员Id
                roleDao.addRoleModule(roleModuleVO);
            }
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.TRUE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "添加功能设置成功！");
            logger.debug("添加功能设置成功！");
        } catch (Exception e) {
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "添加功能设置失败！");
            logger.error("添加功能设置失败！" + e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
        return resultMap;
    }

    /**
     * 修改功能
     *
     * @param moduleVO
     * @return
     */
    @Override
    public Map<String, Object> updateModule(ModuleVO moduleVO) throws Exception {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            // 添加栏目
            menuDao.updateModule(moduleVO);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.TRUE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "修改功能设置成功！");
            logger.debug("修改功能设置成功！");
        } catch (Exception e) {
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "修改功能设置失败！");
            logger.error("修改功能设置失败！" + e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
        return resultMap;
    }

    /**
     * 删除功能
     *
     * @param moduleVO
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> deleteModule(ModuleVO moduleVO) throws Exception {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        try {
            // 添加栏目
            menuDao.deleteModule(moduleVO);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.TRUE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "删除功能设置成功！");
            logger.debug("删除功能设置成功！");
        } catch (Exception e) {
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_RESULT, Boolean.FALSE);
            resultMap.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_MSG, "删除功能设置失败！");
            logger.error("删除功能设置失败！" + e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
        return resultMap;
    }

    /**
     * 查询功能详细信息
     *
     * @param moduleVO
     * @return
     */
    @Override
    public ModuleVO findModule(ModuleVO moduleVO) {
        return menuDao.findModule(moduleVO);
    }

    /**
     * 分页查询功能所有信息集合
     *
     * @param moduleVO
     * @return
     */
    @Override
    public JSONObject findModules(ModuleVO moduleVO) {
        JSONObject jsonObject = new JSONObject();
        // 查询集合数据总数
        int total = menuDao.findModulesCount(moduleVO);
        // 查询集合数据
        List<ModuleVO> moduleDataList = new ArrayList<ModuleVO>();
        if (total > 0) {
            moduleDataList = menuDao.findModules(moduleVO);
        }
        jsonObject.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_ROWS, moduleDataList);
        jsonObject.put(TmompConstant.BaseDataConstant.DEFAULT_VALUE_TOTAL, total);
        return jsonObject;
    }

    /**
     * 查询所有菜单下栏目功能信息
     *
     * @param menuVO
     * @return
     */
    @Override
    public List<MenuVO> findMenuModuleList(MenuVO menuVO) {
        List<MenuVO> newMenuModuleList = new ArrayList<MenuVO>();
        // 载体
        List<String> carrier = new ArrayList<String>();
        // 设置当前用户id
        menuVO.setUserId(TmompUser.getCurrentUserId());
        // 菜单功能权限
        List<MenuVO> menuModuleList = menuDao.findMenuModuleList(menuVO);
        if (null != menuModuleList && menuModuleList.size() > 0) {
            for (int i = 0; i < menuModuleList.size(); i++) {
                MenuVO me = menuModuleList.get(i);
                // 存在相同的菜单
                if (carrier.contains(me.getMenuId())) {
                    for (MenuVO men : newMenuModuleList) {
                        if (men.getMenuId().equals(me.getMenuId())) {
                            men.getModuleList().add(me.getModuleVO());
                        }
                    }
                } else {
                    carrier.add(me.getMenuId());
                    me.getModuleList().add(me.getModuleVO());
                    newMenuModuleList.add(me);
                }
            }
        }
        return newMenuModuleList;
    }
}
